package main

import (
	"client/util"
	"fmt"
	"github.com/afex/hystrix-go/hystrix"
	"log"
	"time"
)

func main() {
	// 配置时间，当调用的接口或服务在配置的时间内没有返回时，就执行服务降级
	hystrix.ConfigureCommand("getProduct", hystrix.CommandConfig{
		Timeout:                2000, // 表示超过2秒时间没有响应，调用服务降级方法
		MaxConcurrentRequests:  3,    // 最大3个并发

		// 当请求数符合配置的熔断器参数，熔断器会自动打开。执行降级，表现在服务降级后返回的参数特别的快
		RequestVolumeThreshold: 3,    // 熔断器请求阀值。意思是有3个请求才才进行错误白反比计算,默认20
		ErrorPercentThreshold:  20,   // 错误百反比。默认 50（50%）

		// 熔断器3种状态
		SleepWindow: int(time.Second * 100), // 熔断器打开后，多少毫秒尝试恢复，建议5到10秒
	})

	err := hystrix.Do(
		"getProduct",// 使用 getProduct 配置
		func() error { // 正常业务逻辑
			res, err := util.GetUser()
			if err != nil {
				return err
			}
			fmt.Println(res)
			return nil
		},
		func(err error) error { // 服务降级业务逻辑,使用本地服务
			fmt.Println("服务降级")
			return err
		},
	)
	if err != nil {
		log.Fatal(err)
	}
}
